// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

#ifndef _JIT_FP

#define _JIT_FP

// Auxiliary structures.
#if FEATURE_STACK_FP_X87

enum dummyFPenum
{
#define REGDEF(name, rnum, mask, sname) dummmy_##name = rnum,
#include "registerfp.h"

    FP_VIRTUALREGISTERS,
};

// FlatFPStateX87 holds the state of the virtual register file. For each
// virtual register we keep track to which physical register we're
// mapping. We also keep track of the physical stack.

#define FP_PHYSICREGISTERS FP_VIRTUALREGISTERS
#define FP_VRNOTMAPPED -1

struct FlatFPStateX87
{
public:
    void Init(FlatFPStateX87* pFrom = 0);
    bool Mapped(unsigned uEntry); // Is virtual register mapped
    void Unmap(unsigned uEntry);  // Unmaps a virtual register
    void Associate(unsigned uEntry, unsigned uStack);
    unsigned StackToST(unsigned uEntry); // Maps the stack to a ST(x) entry
    unsigned VirtualToST(unsigned uEntry);
    unsigned STToVirtual(unsigned uST);
    unsigned TopIndex();
    unsigned TopVirtual();
    void Rename(unsigned uVirtualTo, unsigned uVirtualFrom);
    unsigned Pop();
    void Push(unsigned uEntry);
    bool IsEmpty();

    // Debug/test methods
    static bool AreEqual(FlatFPStateX87* pSrc, FlatFPStateX87* pDst);
#ifdef DEBUG
    bool IsValidEntry(unsigned uEntry);
    bool IsConsistent();
    void UpdateMappingFromStack();
    void Dump();

    // In some optimizations the stack will be inconsistent in some transactions. We want to keep
    // the checks for everthing else, so if have the stack in an inconsistent state, you must
    // ignore it on purpose.
    bool m_bIgnoreConsistencyChecks;

    inline void IgnoreConsistencyChecks(bool bIgnore)
    {
        m_bIgnoreConsistencyChecks = bIgnore;
    }
#else
    inline void IgnoreConsistencyChecks(bool bIgnore)
    {
    }
#endif

    unsigned m_uVirtualMap[FP_VIRTUALREGISTERS];
    unsigned m_uStack[FP_PHYSICREGISTERS];
    unsigned m_uStackSize;
};

#endif // FEATURE_STACK_FP_X87
#endif
